package com.openess.bigsearch.engine.BPlusTree;

import com.openess.bigsearch.engine.BTree.util.ByteArrays;

/**
 * 专门针对字符类型设置的比较器，和默认比较器思路一样，差别只是在字符比较器比较的时候需要避过附加信息，字符串长度信息
 * 
 * @author TuTu
 * 
 */
public class StringBKCompare implements BKComparable {

	@Override
	public int compare(byte[] strKey, byte[] data, int offset, int length) {
		int result = 0;
		// 取最小值
		int temp = Math.min(strKey.length, length);
		length = Math.min(data.length, temp) - 2;
		for (int i = 0; result == 0 && i < length; i++) {
			// &0xFF很重要，作用和在ByteArrays.getInt中一样，byte拿到的时候，最高位可能为1，因此做减法前，防止带符号转换成int类型
			// 之前也使用过先将strkey每两个字节转换成char再做减法，但这样会影响效率，建索引时间增加明显
			// 两者最终效果一致
			result = (strKey[i + 2] & 0xFF) - (data[offset + i + 2] & 0xFF);
		}
		// 字符长度
		int strSize1 = ByteArrays.getInt(strKey, 0);
		int strSize2 = ByteArrays.getInt(data, offset);
		// 判断全集与子集的大小
		if (result == 0 && strSize1 > strSize2) {
			result = 1;
		} else if (result == 0 && strSize1 < strSize2) {
			result = -1;
		}
		return result;
	}
}
